import cv2
import time

def capture_video_from_camera_and_save(device_path, output_file, fps=30, duration_seconds=10):
    # 使用 OpenCV 初始化视频捕获
    cap = cv2.VideoCapture(device_path)

    if not cap.isOpened():
        print("Error: Cannot open camera")
        exit()

    # 获取视频的分辨率
    # 设置分辨率，视频帧格式，帧率
    cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*'MJPG'))
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
    cap.set(cv2.CAP_PROP_FPS, 60)

    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

    # 定义编码器并创建 VideoWriter 对象
    # 注意：在 Windows 上，你可能需要指定编码器为 'XVID' 或 'DIVX'
    # 在 Linux 上，通常可以使用 'mp4v' 或让 OpenCV 自动选择
    # 这里我们显式指定为 'libx264'（但 OpenCV 可能不会直接识别，因此可能需要 FFmpeg 封装器）
    # 如果 OpenCV 没有找到 'libx264'，你可能需要安装 FFmpeg 并确保它可以被 OpenCV 调用
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')  # 使用 MP4V 编码器，或尝试 'avc1'（可能需要 FFmpeg）
    out = cv2.VideoWriter(output_file, fourcc, fps, (width, height))

    # 初始化帧率计算
    fps_count = 0
    setup_time = time.time()
    prev_time = time.time()

    try:
        while True:
            # 读取一帧
            ret, frame = cap.read()

            # 如果正确读取帧，ret为True
            if not ret:
                print("Can't receive frame (stream end?). Exiting ...")
                break

            # 显示结果帧（可选）
            cv2.imshow('Frame', frame)

            # 写入视频文件
            out.write(frame)

            # 更新帧率计算
            fps_count += 1
            current_time = time.time()
            if (current_time - prev_time) >= 1:
                print(f"FPS: {fps_count:.2f}")
                fps_count = 0
                prev_time = current_time

            # 检查是否达到指定的持续时间
            if current_time - setup_time >= duration_seconds:
                break

            # 按 'q' 键退出循环（可选，因为我们有持续时间限制）
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break

    finally:
        # 释放捕获和视频写入器
        cap.release()
        out.release()
        # 关闭所有 OpenCV 窗口（如果有的话）
        cv2.destroyAllWindows()

if __name__ == '__main__':
    device_path = '/dev/video0'  # 摄像头设备路径
    output_file = 'output.mp4'   # 输出视频文件名
    capture_video_from_camera_and_save(device_path, output_file, fps=30, duration_seconds=10)